class Subject(object):
	def __init__(self):
		self._observers = []

	def attach(self, observer):
		if not observer in self._observers:
			self._observers.append(observer)

	def detach(self, observer):
		try:
			self._observers.remove(observer)
		except ValueError:
			pass

	def notify(self, modifier=None):
		for observer in self._observers:
			if modifier != observer:
				observer.update(self)


# Example usage
class Data(Subject):
	def __init__(self, name=''):
		super(Data, self).__init__()
		self.name = name
		self._data = 0

	@property
	def data(self):
		print('getttinginsoeaiha')
		return self._data

	@data.setter
	def data(self, value):
		print('setttinginsoeaiha')
		self._data = value



class HexViewer(object):
	def update(self, subject):
		thestring= "HexViewer: Subject %s has data 0x%x" % (subject.name, subject.data)
		print(thestring)


class DecimalViewer(object):
	def update(self, subject):
		thestring= 'DecimalViewer: Subject %s has data %d' % (subject.name, subject.data)
		print(thestring)


# Example usage...
def main():
	data1 = Data('Data 1')
	data2 = Data('Data 2')
	view1 = DecimalViewer()
	view2 = HexViewer()
	data1.attach(view1)
	data1.attach(view2)
	data2.attach(view2)
	data2.attach(view1)

	print( "Setting Data 1 = 10")
	data1.data = 10
	print( "Setting Data 2 = 15")
	data2.data = 15
	print( "Setting Data 1 = 3")
	data1.data = 3
	print( "Setting Data 2 = 5")
	data2.data = 5
	print( "Detach HexViewer from data1 and data2.")
	data1.detach(view2)
	data2.detach(view2)
	print( "Setting Data 1 = 10")
	data1.data = 10
	print( "Setting Data 2 = 15")
	data2.data = 15

if __name__ == '__main__':
	main()
